--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 20c2895f9eddd4f179a9fbab7a4039ff1c55c800
Parents : d3ca433
Author : Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-04-27T11:17:04-05:00
docs(README): update browser requirements and clarify Android APK packaging details across multiple language files
Changes
7 files changed, 58 insertions(+), 61 deletions(-)
Diff
diff --git a/README.md b/README.md
index 7ef71b07..65cac942 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,10 @@ NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
- pnpm `10.33.0` (from `package.json` `packageManager`)
- Poetry (used by `Taskfile.yml` and CI workflows)
+**Browser Versions Required:**
+
+Safari 16.4 or later, Chrome 111 or later, Firefox 128 or later (bundled web UI).
+
```bash
task install
task lint:all
@@ -140,6 +144,8 @@ meshchatx --headless
pipx install ./reticulum_meshchatx-*-py3-none-any.whl
```
+The wheel **does not embed** Reticulum inside the MeshChatX package. It declares **`rns`** as a normal Python dependency (`rns>=1.1.9` in `pyproject.toml`), so in the same virtualenv or `pip` environment you get **separate** `site-packages` entries. You can **upgrade Reticulum independently** (for example `pip install -U "rns>=1.1.9"`) and the next `meshchatx` run will use that installed `RNS` module, as long as the version still satisfies the declared range. That is the usual “user-controlled” pip story; it is **not** shared with self-contained app bundles.
+
## Run from Source (Web Server Mode)
Use this when developing or when you need a local custom build.
@@ -248,7 +254,7 @@ docker rm "${cid}"
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (build scripts available)
- macOS: build scripts available (`arm64`, `universal`) for local build environments
-- Android: native APKs — ABIs `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), plus universal
+- Android: universal APK only (see [`android/README.md`](android/README.md))
## Android
@@ -267,20 +273,15 @@ cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-There is a **single** Android variant. Gradle syncs the full `meshchatx/` tree into `app/src/main/python/meshchatx/`, including the offline repository wheel bundle. **ABI packaging** is `universal` (default) or `split` (see `android/app/build.gradle`).
-
-With **`-PmeshchatxAbiPackaging=universal`** (default), each build type is one APK with every selected ABI:
+There is a **single** Android variant. Gradle syncs the full `meshchatx/` tree into `app/src/main/python/meshchatx/`, including the offline repository wheel bundle. Published and documented builds use **universal** packaging only: one debug APK and one release APK per run, each containing the native ABIs configured in `android/app/build.gradle`.
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
-With **`-PmeshchatxAbiPackaging=split`** and more than one ABI in `-PmeshchatxAbis`, Gradle may emit per-ABI APKs as documented in `android/README.md`.
-
Notes:
- Release outputs are unsigned by default unless you configure signing (`scripts/sign-android-apks.sh`).
-- Android targets the ABIs listed in `android/app/build.gradle` (including `armeabi-v7a` when enabled). Building wheels for `armeabi-v7a` needs an Android SDK on `ANDROID_HOME` (see `android/README.md`).
-- Override ABI selection with `-PmeshchatxAbis=<comma-separated list>` or `MESHCHATX_ABIS`. Override packaging with `-PmeshchatxAbiPackaging=universal|split` or `MESHCHATX_ABI_PACKAGING`.
+- Native ABIs embedded in the universal APK follow `android/app/build.gradle` (including `armeabi-v7a` when enabled). Building wheels for `armeabi-v7a` needs an Android SDK on `ANDROID_HOME` (see `android/README.md`).
- If repo root `dist/reticulum_meshchatx-*.whl` exists (for example from `python -m build --wheel -o dist .`), bundled repository refresh prefers that wheel over PyPI for the MeshChatX package. CI builds that wheel before the Android Gradle step.
Additional docs:
diff --git a/android/README.md b/android/README.md
index a36cd72a..04067efa 100644
--- a/android/README.md
+++ b/android/README.md
@@ -30,14 +30,15 @@ cd android
There is a **single** application variant (no product flavors). Gradle syncs the **entire** `meshchatx/` tree into `app/src/main/python/meshchatx/` (including `public/repository-server-bundled` for the in-app repository server). The `fetchRepositoryBundledWheels` task runs before sync when bundled wheels are missing; if repo root `dist/reticulum_meshchatx-*.whl` exists (e.g. from `python -m build --wheel -o dist .`), that wheel is preferred over PyPI for the bundled set.
-### ABI selection and packaging
+### Native ABIs (universal APK)
-- **`-PmeshchatxAbis=...`** or **`MESHCHATX_ABIS`**: comma-separated list from `arm64-v8a`, `x86_64`, `armeabi-v7a` (default: all three).
-- **`-PmeshchatxAbiPackaging=universal|split`** or **`MESHCHATX_ABI_PACKAGING`**: `universal` (default) emits one APK per build type; `split` may emit per-ABI splits when more than one ABI is selected.
+Release and debug artifacts are **universal APKs** only: one APK per build type, embedding the native libraries for each ABI selected at build time.
+
+- **`-PmeshchatxAbis=...`** or **`MESHCHATX_ABIS`**: comma-separated list from `arm64-v8a`, `x86_64`, `armeabi-v7a` (default: all three). This controls which `.so` variants are merged into the single universal APK, not separate per-ABI store listings.
### Outputs
-With default **universal** packaging:
+Each build produces:
- Debug: `app/build/outputs/apk/debug/app-debug.apk`
- Release (unsigned until you sign): `app/build/outputs/apk/release/app-release-unsigned.apk`
diff --git a/lang/README.de.md b/lang/README.de.md
index 9d01c449..2bc27db8 100644
--- a/lang/README.de.md
+++ b/lang/README.de.md
@@ -38,6 +38,10 @@ NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
- pnpm `10.33.0` (aus `package.json`, Feld `packageManager`)
- Poetry (verwendet in `Taskfile.yml` und CI-Workflows)
+**Browser Versions Required:**
+
+Safari 16.4 oder neuer, Chrome 111 oder neuer, Firefox 128 oder neuer (Web-Oberflaeche).
+
```bash
task install
task lint:all
@@ -247,7 +251,7 @@ docker rm "${cid}"
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (Build-Skripte vorhanden)
- macOS: Build-Skripte vorhanden (`arm64`, `universal`) fuer lokale Build-Umgebungen
-- Android: native APKs — ABIs `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), plus universal
+- Android: nur Universal-APK (siehe [`android/README.md`](../android/README.md))
## Android
@@ -266,20 +270,15 @@ cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-**Eine** Android-Variante. Gradle synchronisiert den gesamten `meshchatx/`-Ordner nach `app/src/main/python/meshchatx/`, inklusive Offline-Repository-Raeder. **ABI-Verpackung:** `universal` (Standard) oder `split` (siehe `android/app/build.gradle`).
-
-Bei **`-PmeshchatxAbiPackaging=universal`** (Standard) liefert jeder Buildtyp ein APK mit allen gewaehlten ABIs:
+**Eine** Android-Variante. Gradle synchronisiert den gesamten `meshchatx/`-Ordner nach `app/src/main/python/meshchatx/`, inklusive Offline-Repository-Raeder. Dokumentierte und veroeffentlichte Builds nutzen ausschliesslich **Universal**-Packaging: je ein Debug- und ein Release-APK pro Lauf, mit allen in `android/app/build.gradle` gewaehlten nativen ABIs.
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
-Bei **`-PmeshchatxAbiPackaging=split`** und mehr als einem ABI in `-PmeshchatxAbis` koennen pro-ABI-APKs entstehen, wie in [`android/README.md`](../android/README.md) beschrieben.
-
Hinweise:
- Release-Builds sind standardmaessig unsigniert, bis die Signatur konfiguriert ist (`scripts/sign-android-apks.sh`).
-- Android richtet sich nach den in `android/app/build.gradle` gelisteten ABIs (einschliesslich `armeabi-v7a`, falls aktiviert). Das Bauen von Radern fuer `armeabi-v7a` erfordert ein Android-SDK in `ANDROID_HOME` (siehe `android/README.md`).
-- ABI-Liste: `-PmeshchatxAbis` oder `MESHCHATX_ABIS`. Verpackung: `-PmeshchatxAbiPackaging=universal|split` oder `MESHCHATX_ABI_PACKAGING`.
+- Die im Universal-APK enthaltenen nativen ABIs folgen `android/app/build.gradle` (einschliesslich `armeabi-v7a`, falls aktiviert). Das Bauen von Radern fuer `armeabi-v7a` erfordert ein Android-SDK in `ANDROID_HOME` (siehe `android/README.md`).
- Existiert im Repo-Root `dist/reticulum_meshchatx-*.whl` (z. B. nach `python -m build --wheel -o dist .`), bevorzugt die Aktualisierung des Offline-Repositorys dieses Wheel gegueber PyPI. In der CI wird das Wheel vor dem Android-Gradle-Schritt gebaut.
Weitere Dokumentation:
@@ -350,11 +349,11 @@ Aktuelle Version in diesem Repository: `4.6.0`.
Arbeitsablauf des Autors: ArgosTranslate, dann lokales LLM (Qwen 3 + Gemma 4).
-Korrekturen von der Community sind willkommen — per LXMF oder wo Sie erreichbar sind.
+Korrekturen von der Community sind willkommen, per LXMF oder wo Sie erreichbar sind.
Die Locale-Erkennung erfolgt automatisch. Fuegen Sie Dateien unter `meshchatx/src/frontend/locales/` hinzu (z. B. `xx.json`) mit denselben Schluesseln wie `en.json` und oberstes `_languageName` fuer die Sprachauswahl. Sie koennen `en.json` kopieren und alles manuell uebersetzen; **maschinenunterstuetzte Erzeugung (optional)** ist niemals erforderlich.
-**Optional: Argos-Translate-Start** — fuer einen Entwurf aus `en.json` koennen Sie `scripts/argos_translate.py` nutzen; es behandelt Formatierung, farbige Ausgabe und schuetzt z. B. `{count}`.
+**Optional: Argos-Translate-Start:** fuer einen Entwurf aus `en.json` koennen Sie `scripts/argos_translate.py` nutzen; es behandelt Formatierung, farbige Ausgabe und schuetzt z. B. `{count}`.
```bash
# argostranslate ggf. installieren
diff --git a/lang/README.it.md b/lang/README.it.md
index 4453954c..33457bfb 100644
--- a/lang/README.it.md
+++ b/lang/README.it.md
@@ -38,6 +38,10 @@ NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
- pnpm `10.33.0` (da `package.json`, campo `packageManager`)
- Poetry (utilizzato in `Taskfile.yml` e nei workflow CI)
+**Browser Versions Required:**
+
+Safari 16.4 o successivo, Chrome 111 o successivo, Firefox 128 o successivo (interfaccia web integrata).
+
```bash
task install
task lint:all
@@ -247,7 +251,7 @@ docker rm "${cid}"
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (script di build disponibili)
- macOS: script di build disponibili (`arm64`, `universal`) per ambienti di build locali
-- Android: APK nativi — `arm64-v8a`, `x86_64`, `armeabi-v7a` (ARM a 32 bit), piu universale
+- Android: solo APK universale (vedi [`android/README.md`](../android/README.md))
## Android
@@ -266,20 +270,15 @@ cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-**Una** sola variante Android. Gradle sincronizza l'intera directory `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. **Packaging ABI:** `universal` (predefinito) o `split` (vedi `android/app/build.gradle`).
-
-Con **`-PmeshchatxAbiPackaging=universal`** (predefinito) ogni tipo di build e un APK con tutti gli ABI scelti:
+**Una** sola variante Android. Gradle sincronizza l'intera directory `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. Build documentate e pubblicate usano solo packaging **universal**: un APK debug e uno release per esecuzione, ciascuno con tutti gli ABI nativi configurati in `android/app/build.gradle`.
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
-Con **`-PmeshchatxAbiPackaging=split`** e piu di un ABI in `-PmeshchatxAbis`, Gradle puo emettere APK per ABI come documentato in [`android/README.md`](../android/README.md).
-
Note:
- Gli output di release non sono firmati finche non configuri la firma (`scripts/sign-android-apks.sh`).
-- Android punta agli ABI elencati in `android/app/build.gradle` (incluso `armeabi-v7a` se abilitato). Le wheel per `armeabi-v7a` richiedono Android SDK su `ANDROID_HOME` (vedi `android/README.md`).
-- Selezione ABI: `-PmeshchatxAbis` o `MESHCHATX_ABIS`. Packaging: `-PmeshchatxAbiPackaging=universal|split` o `MESHCHATX_ABI_PACKAGING`.
+- Gli ABI nativi nel APK universale seguono `android/app/build.gradle` (incluso `armeabi-v7a` se abilitato). Le wheel per `armeabi-v7a` richiedono Android SDK su `ANDROID_HOME` (vedi `android/README.md`).
- Se esiste in root `dist/reticulum_meshchatx-*.whl` (es. da `python -m build --wheel -o dist .`), l'aggiornamento del repository in bundle preferisce quella wheel rispetto a PyPI. In CI la wheel viene costruita prima del passo Gradle Android.
Documentazione aggiuntiva:
diff --git a/lang/README.ja.md b/lang/README.ja.md
index 6426c717..09ac1239 100644
--- a/lang/README.ja.md
+++ b/lang/README.ja.md
@@ -38,6 +38,10 @@ NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
- pnpm `10.33.0`(`package.json` の `packageManager`)
- Poetry(`Taskfile.yml` および CI ワークフローで使用)
+**Browser Versions Required:**
+
+Safari 16.4 以降、Chrome 111 以降、Firefox 128 以降(同梱 Web UI)。
+
```bash
task install
task lint:all
@@ -247,7 +251,7 @@ docker rm "${cid}"
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64`(ビルドスクリプトあり)
- macOS: ローカルビルド向けにビルドスクリプトあり(`arm64`, `universal`)
-- Android: ネイティブ APK — ABI `arm64-v8a`、`x86_64`、`armeabi-v7a`(32-bit ARM)、および universal
+- Android: universal APK のみ([`android/README.md`](../android/README.md) 参照)
## Android
@@ -266,20 +270,15 @@ cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-**単一**の Android バリアント。Gradle が `meshchatx/` ツリー全体を `app/src/main/python/meshchatx/` に同期し、オフラインリポジトリ用ホイールも含みます。**ABI パッケージング:** `universal`(既定)または `split`(`android/app/build.gradle`)。
-
-**`-PmeshchatxAbiPackaging=universal`**(既定)では、各ビルド種別は選択した全 ABI を含む 1 つの APK です:
+**単一**の Android バリアント。Gradle が `meshchatx/` ツリー全体を `app/src/main/python/meshchatx/` に同期し、オフラインリポジトリ用ホイールも含みます。ドキュメントおよび公開ビルドは **universal** パッケージのみです。実行ごとにデバッグ APK 1 本とリリース APK 1 本が生成され、それぞれ `android/app/build.gradle` で選んだ全ネイティブ ABI を含みます。
- デバッグ: `android/app/build/outputs/apk/debug/app-debug.apk`
- リリース: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
-**`-PmeshchatxAbiPackaging=split`** かつ `-PmeshchatxAbis` に ABI が複数ある場合、ABI 別 APK になることがあります([`android/README.md`](../android/README.md) 参照)。
-
備考:
- リリース成果物は、署名を設定するまで既定で未署名(`scripts/sign-android-apks.sh`)。
-- 対象 ABI は `android/app/build.gradle` の一覧(`armeabi-v7a` 有効時を含む)。`armeabi-v7a` 用ホイールのビルドには `ANDROID_HOME` の Android SDK が必要(`android/README.md` 参照)。
-- ABI 上書き: `-PmeshchatxAbis` または `MESHCHATX_ABIS`。パッケージング: `-PmeshchatxAbiPackaging=universal|split` または `MESHCHATX_ABI_PACKAGING`。
+- universal APK に埋め込まれるネイティブ ABI は `android/app/build.gradle` の一覧(`armeabi-v7a` 有効時を含む)。`armeabi-v7a` 用ホイールのビルドには `ANDROID_HOME` の Android SDK が必要(`android/README.md` 参照)。
- リポジトリルートに `dist/reticulum_meshchatx-*.whl` があると(例: `python -m build --wheel -o dist .`)、同梱リポジトリの更新で PyPI よりその MeshChatX ホイールを優先。CI では Android Gradle の前にそのホイールをビルドします。
追加ドキュメント:
diff --git a/lang/README.ru.md b/lang/README.ru.md
index 0da2739b..447b4ff6 100644
--- a/lang/README.ru.md
+++ b/lang/README.ru.md
@@ -38,6 +38,10 @@ NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
- pnpm `10.33.0` (из `package.json`, поле `packageManager`)
- Poetry (используется в `Taskfile.yml` и CI)
+**Browser Versions Required:**
+
+Safari 16.4 или новее, Chrome 111 или новее, Firefox 128 или новее (встроенный веб-интерфейс).
+
```bash
task install
task lint:all
@@ -216,7 +220,7 @@ task dist:fe:rpm
## Сборка в контейнере (wheel, AppImage, deb, rpm)
-`Dockerfile.build` выполняет те же шаги, что и CI (Poetry, pnpm, `task`, пакетные зависимости APT). Ориентирован на **linux/amd64** (NodeSource amd64, Task amd64). Цель по умолчанию — всё; её можно переопределить build-arg.
+`Dockerfile.build` выполняет те же шаги, что и CI (Poetry, pnpm, `task`, пакетные зависимости APT). Ориентирован на **linux/amd64** (NodeSource amd64, Task amd64). Цель по умолчанию: всё; её можно переопределить build-arg.
Для `MESHCHATX_BUILD_TARGETS` доступны: `all` (по умолчанию), `wheel` или `electron` (AppImage + deb для x64 и arm64, RPM по возможности, без wheel).
@@ -247,7 +251,7 @@ docker rm "${cid}"
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (скрипты сборки есть)
- macOS: скрипты сборки (`arm64`, `universal`) для локальных сред
-- Android: нативные APK — ABI `arm64-v8a`, `x86_64`, `armeabi-v7a` (32-bit ARM), плюс universal
+- Android: только universal APK (см. [`android/README.md`](../android/README.md))
## Android
@@ -266,20 +270,15 @@ cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-**Один** вариант Android. Gradle синхронизирует весь каталог `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. **Упаковка ABI:** `universal` (по умолчанию) или `split` (см. `android/app/build.gradle`).
-
-С **`-PmeshchatxAbiPackaging=universal`** (по умолчанию) у каждого типа сборки один APK со всеми выбранными ABI:
+**Один** вариант Android. Gradle синхронизирует весь каталог `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. Документированные и публикуемые сборки используют только **universal**: за один прогон один debug APK и один release APK, каждый со всеми нативными ABI из `android/app/build.gradle`.
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
-С **`-PmeshchatxAbiPackaging=split`** и более чем одним ABI в `-PmeshchatxAbis` Gradle может выдавать отдельные APK по ABI, как в [`android/README.md`](../android/README.md).
-
Примечания:
- Релизы по умолчанию не подписаны, пока не настроена подпись (`scripts/sign-android-apks.sh`).
-- Android ориентируется на ABI из `android/app/build.gradle` (в т.ч. `armeabi-v7a`, если включён). Сборка колёс для `armeabi-v7a` требует Android SDK в `ANDROID_HOME` (см. `android/README.md`).
-- Список ABI: `-PmeshchatxAbis` или `MESHCHATX_ABIS`. Упаковка: `-PmeshchatxAbiPackaging=universal|split` или `MESHCHATX_ABI_PACKAGING`.
+- Нативные ABI внутри universal APK задаются в `android/app/build.gradle` (в т.ч. `armeabi-v7a`, если включён). Сборка колёс для `armeabi-v7a` требует Android SDK в `ANDROID_HOME` (см. `android/README.md`).
- Если в корне репо есть `dist/reticulum_meshchatx-*.whl` (например из `python -m build --wheel -o dist .`), обновление встроенного репозитория предпочитает эту wheel пакету MeshChatX с PyPI. В CI wheel собирается до шага Android Gradle.
Дополнительная документация:
@@ -350,11 +349,11 @@ task build:all
Авторский рабочий процесс: ArgosTranslate, затем локальная LLM (Qwen 3 + Gemma 4).
-Затем правки и улучшения от сообщества приветствуются — через LXMF или любой доступный канал.
+Затем правки и улучшения от сообщества приветствуются через LXMF или любой доступный канал.
Обнаружение локали автоматическое. Добавьте файл в `meshchatx/src/frontend/locales/` (например `xx.json`) с теми же ключами, что в `en.json`, и строку верхнего уровня `_languageName` для подписи в селекторе. Можно скопировать `en.json` и перевести вручную; **машинная генерация (в т. ч. Argos) необязательна** и никогда не требуется.
-**По желанию: старт с Argos Translate** — для чернового перевода из `en.json` можно вызвать `scripts/argos_translate.py` (форматирование, цветной вывод, защита плейсхолдеров вроде `{count}`).
+**По желанию: старт с Argos Translate:** для чернового перевода из `en.json` можно вызвать `scripts/argos_translate.py` (форматирование, цветной вывод, защита плейсхолдеров вроде `{count}`).
```bash
# Установите argostranslate при необходимости
@@ -366,15 +365,15 @@ python scripts/argos_translate.py --from en --to xx --input meshchatx/src/fronte
После любой машинной прогонки пусть LLM или человек проверяет грамматику, контекст и тон (например формальный/неформальный стиль).
-`pnpm test -- tests/frontend/i18n.test.js --run` — проверка равенства ключей с `en.json`.
+`pnpm test -- tests/frontend/i18n.test.js --run`: проверка равенства ключей с `en.json`.
Никаких других изменений в коде не требуется. Приложение, селектор языка и тесты обнаруживают локали из каталога `meshchatx/src/frontend/locales/` во время сборки.
## Авторы
-- [Liam Cottle](https://github.com/liamcottle) — оригинальный Reticulum MeshChat
-- [RFnexus](https://github.com/RFnexus) — парсер micron (JavaScript)
-- [markqvist](https://github.com/markqvist) — Reticulum, LXMF, LXST
+- [Liam Cottle](https://github.com/liamcottle) - оригинальный Reticulum MeshChat
+- [RFnexus](https://github.com/RFnexus) - парсер micron (JavaScript)
+- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## Лицензия
diff --git a/lang/README.zh.md b/lang/README.zh.md
index 6f7654f4..43454ec1 100644
--- a/lang/README.zh.md
+++ b/lang/README.zh.md
@@ -38,6 +38,10 @@ NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
- pnpm `10.33.0`(来自 `package.json` 的 `packageManager`)
- Poetry(用于 `Taskfile.yml` 与 CI 工作流)
+**Browser Versions Required:**
+
+Safari 16.4 或更高版本、Chrome 111 或更高版本、Firefox 128 或更高版本(内置 Web UI)。
+
```bash
task install
task lint:all
@@ -247,7 +251,7 @@ docker rm "${cid}"
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64`(提供构建脚本)
- macOS: 提供构建脚本(`arm64`、`universal`),适用于本地构建环境
-- Android: 原生 APK — ABI `arm64-v8a`、`x86_64`、`armeabi-v7a`(32 位 ARM),以及 universal
+- Android: 仅 universal APK(见 [`android/README.md`](../android/README.md))
## Android
@@ -266,20 +270,15 @@ cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
-**单一** Android 变体。Gradle 将完整 `meshchatx/` 树同步到 `app/src/main/python/meshchatx/`,含离线仓库 wheel 包。**ABI 打包:** `universal`(默认)或 `split`(见 `android/app/build.gradle`)。
-
-**`-PmeshchatxAbiPackaging=universal`**(默认)下,每种构建类型各一个包含所有已选 ABI 的 APK:
+**单一** Android 变体。Gradle 将完整 `meshchatx/` 树同步到 `app/src/main/python/meshchatx/`,含离线仓库 wheel 包。文档与发布流程仅使用 **universal** 打包:每次运行各生成一个调试 APK 与一个发布 APK,内含 `android/app/build.gradle` 中配置的全部原生 ABI。
- 调试:`android/app/build/outputs/apk/debug/app-debug.apk`
- 发布:`android/app/build/outputs/apk/release/app-release-unsigned.apk`
-**`-PmeshchatxAbiPackaging=split`** 且 `-PmeshchatxAbis` 含多个 ABI 时,Gradle 可能按 ABI 分别产出 APK,见 [`android/README.md`](../android/README.md)。
-
说明:
- 发布产物默认未签名,除非配置签名(`scripts/sign-android-apks.sh`)。
-- Android 目标 ABI 以 `android/app/build.gradle` 为准(含启用时的 `armeabi-v7a`)。为 `armeabi-v7a` 构建 wheel 需本机 `ANDROID_HOME` 上有 Android SDK(见 `android/README.md`)。
-- 覆盖 ABI:`-PmeshchatxAbis` 或 `MESHCHATX_ABIS`。打包:`-PmeshchatxAbiPackaging=universal|split` 或 `MESHCHATX_ABI_PACKAGING`。
+- universal APK 内嵌的原生 ABI 以 `android/app/build.gradle` 为准(含启用时的 `armeabi-v7a`)。为 `armeabi-v7a` 构建 wheel 需本机 `ANDROID_HOME` 上有 Android SDK(见 `android/README.md`)。
- 若仓库根存在 `dist/reticulum_meshchatx-*.whl`(例如 `python -m build --wheel -o dist .`),刷新内置仓库时优先于 PyPI 使用该 MeshChatX wheel。CI 在 Android Gradle 步骤前会构建该 wheel。
更多文档:
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────